XSS 跨站点脚本攻击

前言

XSS又称CSS,全称Cross SiteScript,即跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如盗取用户Cookie、破坏页面结构、重定向到其它网站等。

XSS攻击类型

XSS的攻击类型分为两种:存储型和反射型。

  • 反射型攻击

    访问地址:
    http://www.pandan.xyz/login.jsp?from=<script>alert('XSS反射型攻击')</script>

    login.jsp/login.php等
    <html>
    <%
    String from = request.getParameter("from");
    request.setAttribute("from",from);
    %>
    <input value=${from}></input>
    </html>

    以上地址当login.jsp或login.php等页面中有用到访问地址中传入的from参数,又没有对其进行转义处理时,浏览器解析到input标签中的value属性时,就会立即触发恶意脚本的执行,引发安全问题。

  • 存储型攻击

    存储型攻击是指像论坛发帖,恶意用户在论坛发帖时,输入恶意js代码。如果服务端没有对用户输入的内容进行转义及过滤处理的话,会将含恶意脚本的评论存入数据库中,当正常用户浏览该帖子时,就会触发恶意脚本的执行,引发一系列安全问题。所以,存储型攻击的特点是恶意脚本会存储到数据库中,在正常用户加载该信息时触发攻击,多出现在论坛,贴吧等公共评论的网站中。

XSS带来的危害

  • 获取浏览器cookie中保存的会话Id,劫持session,模拟用户访问;
  • 在用户访问的网络页面上植入钓鱼链接,诱使用户点击,进而触发CSRF跨站点请求伪造,或者是跳到非法页面,诱使用户输入敏感信息等;
  • 破坏页面结构,在页面植入非法广告等;
  • ……

如何防范XSS攻击

  1. 设置cookie为HttpOnly,禁止js读取cookie信息;
  2. 对用户传入的参数,以及url地址中的参数进行转义或过滤处理;
/**
* 过滤掉脚本执行的关键字符
* @param html
* @return
*/
public static String filter(String html) {
if (html == null) {
return null;
}
String result = html.replace("<", "");
result = result.replace(">", "");
result = result.replace("&", "");
result = result.replace("\"", "");
result = result.replace("'", "");
return result;
}

/**
* 对转入的字符串转义处理,在浏览器中显示时,
* 是以文本的形式原样输出,而不是解释执行。
* @param html
* @return
*/
public static String escape(String html) {
if (html == null) {
return null;
}
String result = html.replace("&", "&amp;");
result = result.replace("<", "&lt;");
result = result.replace(">", "&gt;");
result = result.replace("\\", "&quot;");
result = result.replace("'", "&apos;");
return result;
}